/*
 * HiloProcesamiento.cpp
 *
 *  Created on: 20/05/2012
 *      Author: Shazgath
 */

#include "Worker.h"
#include "Consulta.h"

Worker::Worker(Cola<Consulta*>& cE, Cola<Respuesta*>& cR, Data::Datos& ref, Servidor& server)
: colaDeEntrada(cE), colaDeSalida(cR), datos(ref), serv(server) {
}

Worker::~Worker() {
}

Respuesta* Worker::procesarConsulta(Consulta* c) {
	std::ostringstream answer;
	Respuesta* res;
	bool esConsultaColumna = c->esConsultaColumna();
	if(esConsultaColumna) {
		datos.obtenerValorColumna(*c, answer);
		res = new Respuesta(c->getId(), c->getIdConsulta(), 'C');
	} else {
		std::cout << "LLEGO ACA!!!!!" << std::endl;
		datos.Consultar(*c, answer);
		res = new Respuesta(c->getId(), c->getIdConsulta(), 'R');
	}
	std::string consulta;
	consulta = c->serializarParaServidor();

	std::stringstream ss;

	if(esConsultaColumna){
		Atributo_consulta* atrib = c->getAtributo(0);
		std::string nombre = serv.getNombreAtributo(atrib->getPos(), c->getNTabla());
		//respuesta.append(nombre);

		std::string::iterator it = nombre.begin();		// borro basura
		nombre.erase(it);				// borro basura

		ss << nombre;
	}
	//respuesta.append(answer.str());
	ss << answer.str();
	std::string respuesta = ss.str();
	//if(esConsultaColumna) {
	//	respuesta.append("\n");
	//}
	for(int i = 0; i < respuesta.size(); ++i) {
		if(respuesta[i] == '\r' )
			respuesta[i] = '|';
	}

	res->setRespuesta(respuesta);
	return res;
}

void Worker::run() {
	while(isRunning()) {
		Consulta* c = serv.popConsulta();
		if(c != NULL) {
			Respuesta* r = procesarConsulta(c);
			serv.pushRespuesta(r);
			delete c;
		} else
			stop();
	}
}

